package org.jaronsource.framework.core.dao.support;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

/**
 * 通用DAO接口
 * 
 * @author Jaron
 * 
 */
public interface ICommonDao extends IDao {

	/**
	 * 得到JPA中的EntityManager
	 * 
	 * @return EntityManager对象
	 */
	public EntityManager getEntityManager();

	/**
	 * 保存对象
	 * 
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Foo foo1 = new Foo();
	 * commonDao.save( foo1 );
	 * </pre>
	 * 
	 * @param target 待保存的对象
	 * @return 已保存的对象
	 */
	<T extends IEntity<I>, I extends Serializable> T save( T target );

	/**
	 * 一次保存任意多个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Foo foo1 = new Foo(); Foo foo2 = new Foo(); ... commonDao.save(foo1, foo2, ...);
	 * </pre>
	 * 
	 * @param targets 待保存的对象（任意个数，用","号分隔开）
	 * @return 已保存对象的数组
	 */
	<T extends IEntity<I>, I extends Serializable> T[] save( T... targets );
	
	/**
	 * <p> 更新对象，只更新非null得属性
	 * 
	 * <p> 示例：
	 * 
	 * <pre> Foo foo1 = new Foo(); fooDao.update( foo1, 1 ); </pre>
	 * 
	 * @param target 待更新的对象
	 * @return 已更新的对象
	 */
	<T extends IEntity<I>, I extends Serializable> void update( T target, I pk );
	
	/**
	 * 删除对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Foo foo1 = new Foo();
	 * commonDao.remove( foo1 );
	 * </pre>
	 * 
	 * @param target 待删除的对象
	 */
	<T extends IEntity<I>, I extends Serializable> void remove( T target );

	/**
	 * 删除任意多个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Foo foo1 = new Foo();
	 * Foo foo2 = new Foo();
	 * commonDao.remove( foo1, foo2 );
	 * </pre>
	 * 
	 * @param targets 待删除的对象
	 */
	<T extends IEntity<I>, I extends Serializable> void remove( T... targets );

	/**
	 * 按id删除对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * int id = 1;
	 * commonDao.remove( Foo.class, id );
	 * </pre>
	 * 
	 * @param id 待删除对象的id
	 */
	<T extends IEntity<I>, I extends Serializable> void remove( Class<T> clazz,
																I id );
	
	/**
	 * <p>
	 * 一次删除任意多个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * commonDao.remove( Foo.class 1, 2, 3 );
	 * </pre>
	 * 
	 * @param id 待删除对象的id（任意个数，用","号分隔开）
	 */
	<T extends IEntity<I>, I extends Serializable> void remove( Class<T> clazz,
																I... ids );

	/**
	 * 检查对象是否在数据库中存在
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * int id = 1;
	 * commonDao.exists( Foo.class, id );
	 * </pre>
	 * 
	 * @param id 待检查对象的id
	 * @return 是否在数据库中存在
	 */
	<T extends IEntity<I>, I extends Serializable> boolean
			exists( Class<T> clazz, I id );

	/**
	 * 按主键查找对象引用
	 * <p>
	 * 如果对象已在持久化上下文中，直接返回此对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Foo foo = commonDao.findReferenceByPk( Foo.class, id );
	 * </pre>
	 * 
	 * @param id 主键
	 * @return 返回找到的对象引用
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findReferenceByPk( Class<T> clazz, I id );

	/**
	 * 按主键查找对象
	 * <p>
	 * 如果对象已在持久化上下文中，直接返回此对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Foo foo = commonDao.findByPk( Foo.class, id );
	 * </pre>
	 * 
	 * @param id 主键
	 * @return 返回找到的对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T findByPk(	Class<T> clazz,
																I id );

	/**
	 * 根据查询条件，查出第一个符合条件的对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Criteria criteria = new Criteria();
	 * criteria.addEntry( &quot;name&quot;, Op.EQ, &quot;name1&quot; );
	 * Foo foo = commonDao.findOne( Foo.class, criteria );
	 * </pre>
	 * 
	 * @param criteria 查询条件
	 * @return 符合查询条件的第一个对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findOne( Class<T> clazz, Criteria criteria );

	/**
	 * 根据查询条件，查出第一个符合条件的对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * Criteria criteria = new Criteria();
	 * criteria.addEntry( &quot;name&quot;, Op.EQ, &quot;name1&quot; );
	 * Foo foo = commonDao.findOne( Foo.class, sort, criteria );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param criteria 查询条件
	 * @return 符合查询条件的第一个对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findOne( Class<T> clazz, Sort sort, Criteria criteria );

	/**
	 * 使用jpql语句，查出第一个符合条件的对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name = ?&quot;;
	 * Foo foo = commonDao.findOne( Foo.class, jpql, &quot;name1&quot; );
	 * </pre>
	 * 
	 * @param jpql jpql查询语句
	 * @param params jpql参数
	 * @return 符合查询条件的第一个对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findOne( Class<T> clazz, String jpql, Object... params );

	/**
	 * 使用jpql语句，查出第一个符合条件的对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name = :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot; );
	 * Foo foo = commonDao.findOne( Foo.class, jpql, params );
	 * </pre>
	 * 
	 * @param jpql jpql查询语句
	 * @param params jpql参数
	 * @return 符合查询条件的第一个对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findOne( Class<T> clazz, String jpql, Map<String, ?> params );

	/**
	 * 使用jpql语句，查出第一个符合条件的对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; ); String jpql = &quot;select o from Foo o where o.name =
	 * ?&quot;; Foo foo = commonDao.findOne( Foo.class, sort, jpql, &quot;name1&quot; );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql查询语句
	 * @param params jpql参数
	 * @return 符合查询条件的第一个对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findOne( Class<T> clazz, Sort sort, String jpql, Object... params );

	/**
	 * 使用jpql语句，查出第一个符合条件的对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; ); String jpql = &quot;select o from Foo o where o.name =
	 * :name&quot;; Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;(); params.put(
	 * &quot;name&quot;, &quot;name1&quot; ); Foo foo = commonDao.findOne( Foo.class, sort, jpql, params );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql查询语句
	 * @param params jpql参数
	 * @return 符合查询条件的第一个对象 或 null
	 */
	<T extends IEntity<I>, I extends Serializable> T
			findOne(	Class<T> clazz,
						Sort sort,
						String jpql,
						Map<String, ?> params );

	/**
	 * 查出所有对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * List&lt;Foo&gt; fooList = commonDao.findAll( Foo.class );
	 * </pre>
	 * 
	 * @return 所有对象的List
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			findAll( Class<T> clazz );

	/**
	 * 查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String criteria = new Criteria();
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, criteria );
	 * </pre>
	 * 
	 * @param criteria 查询条件
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find( Class<T> clazz, Criteria criteria );

	/**
	 * 使用jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find( Class<T> clazz, String jpql, Object... params );

	/**
	 * 使用jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, jpql, params );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find( Class<T> clazz, String jpql, Map<String, ?> params );

	/**
	 * 使用 排序条件、查询条件，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * Criteria criteria = new Criteria();
	 * criteria.addEntry( &quot;name&quot;, Op.EQ, &quot;name1&quot; );
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, sort, criteria );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param criteria 查询条件
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find( Class<T> clazz, Sort sort, Criteria criteria );

	/**
	 * 使用 分页条件、查询条件，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * Criteria criteria = new Criteria();
	 * criteria.addEntry( &quot;name&quot;, Op.EQ, &quot;name1&quot; );
	 * 
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, pageRequest, criteria );
	 * </pre>
	 * 
	 * @see PageRequest
	 * @param pageRequest 分页条件
	 * @param criteria 查询条件
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find( Class<T> clazz, PageRequest pageRequest, Criteria criteria );

	/**
	 * 使用 排序条件、jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; ); String jpql = &quot;select o from Foo o where o.name like
	 * ?&quot;; List&lt;Foo&gt; fooList = commonDao.find( Foo.class, sort, jpql, &quot;name1&quot;.concat( &quot;%&quot;
	 * ) );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find( Class<T> clazz, Sort sort, String jpql, Object... params );

	/**
	 * 使用 排序条件、jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; ); String jpql = &quot;select o from Foo o where o.name like
	 * :name&quot;; Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;(); params.put(
	 * &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) ); List&lt;Foo&gt; fooList = commonDao.find(
	 * Foo.class, sort, jpql, params );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
			<T extends IEntity<I>, I extends Serializable>
			List<T>
			find( Class<T> clazz, Sort sort, String jpql, Map<String, ?> params );

	/**
	 * 使用 分页条件、jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, pageRequest, jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find(	Class<T> clazz,
					PageRequest pageRequest,
					String jpql,
					Object... params );

	/**
	 * 使用 分页条件、jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * List&lt;Foo&gt; fooList = commonDao.find( Foo.class, pageRequest, jpql, params );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<T extends IEntity<I>, I extends Serializable> List<T>
			find(	Class<T> clazz,
					PageRequest pageRequest,
					String jpql,
					Map<String, ?> params );

	/**
	 * 使用 查询条件，查出符合条件的对象数量
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Criteria criteria = new Criteria();
	 * criteria.addEntry( &quot;name&quot;, Op.EQ, &quot;name1&quot; );
	 * long count = commonDao.count( Foo.class, criteria );
	 * </pre>
	 * 
	 * @param criteria 查询条件
	 * @return 符合条件的对象数量
	 */
	<T extends IEntity<I>, I extends Serializable> long
			count( Class<T> clazz, Criteria criteria );

	/**
	 * 使用 jpql语句，查出符合条件的对象数量
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * long count = commonDao.count( jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	long count( String jpql, Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的对象数量
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * long count = commonDao.count( jpql, params );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	long count( String jpql, Map<String, ?> params );

	/**
	 * 使用 分页条件、查询条件，查出符合条件的分页对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * Criteria criteria = new Criteria();
	 * criteria.addEntry( &quot;name&quot;, Op.EQ, &quot;name1&quot; );
	 * 
	 * Page&lt;Foo&gt; fooPage = commonDao.findPage( Foo.class, pageRequest, criteria );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param criteria 查询条件
	 * @return 符合条件的分页对象
	 */
			<T extends IEntity<I>, I extends Serializable>
			Page<T>
			findPage( Class<T> clazz, PageRequest pageRequest, Criteria criteria );

	/**
	 * 使用 分页条件、jpql语句，查出符合条件的分页对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * Page&lt;Foo&gt; fooPage = commonDao.findPage( Foo.class, pageRequest, jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的分页对象
	 */
	<T extends IEntity<I>, I extends Serializable> Page<T>
			findPage(	Class<T> clazz,
						PageRequest pageRequest,
						String jpql,
						Object... params );

	/**
	 * 使用 分页条件、jpql语句，查出符合条件的分页对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * Page&lt;Foo&gt; fooPage = commonDao.findPage( Foo.class, pageRequest, jpql, params );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的分页对象
	 */
	<T extends IEntity<I>, I extends Serializable> Page<T>
			findPage(	Class<T> clazz,
						PageRequest pageRequest,
						String jpql,
						Map<String, ?> params );

	/**
	 * 使用 jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * List&lt;Foo&gt; fooList = commonDao.query( jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<X> List<X> query( String jpql, Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * List&lt;Foo&gt; fooList = commonDao.query( jpql, params );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<X> List<X> query( String jpql, Map<String, ?> params );

	/**
	 * 使用 jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( name );
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * List<Foo> fooList = commonDao.query(sort, jpql, "name1".concat("%"));
	 * 
	 * <pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<X> List<X> query( Sort sort, String jpql, Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( name );
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * List&lt;Foo&gt; fooList = commonDao.query( sort, jpql, params );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<X> List<X> query( Sort sort, String jpql, Map<String, ?> params );

	/**
	 * 使用 jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( name );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * List&lt;Foo&gt; fooList = commonDao.query( pageRequest, jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<X> List<X> query( PageRequest pageRequest, String jpql, Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的对象集合
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( name );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * List&lt;Foo&gt; fooList = commonDao.query( pageRequest, jpql, params );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的对象集合
	 */
	<X> List<X> query(	PageRequest pageRequest,
						String jpql,
						Map<String, ?> params );

	/**
	 * 使用 jpql语句，查出符合条件的第一个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * Foo foo = (Foo) commonDao.queryOne( jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的第一个对象
	 */
	<X> X queryOne( String jpql, Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的第一个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * Foo foo = (Foo) commonDao.queryOne( jpql, params );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的第一个对象
	 */
	<X> X queryOne( String jpql, Map<String, ?> params );

	/**
	 * 使用 jpql语句，查出符合条件的第一个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; ); String jpql = &quot;select o from Foo o where o.name like
	 * ?&quot;; Foo foo = (Foo) commonDao.queryOne( sort, jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的第一个对象
	 */
	<X> X queryOne( Sort sort, String jpql, Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的第一个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; ); String jpql = &quot;select o from Foo o where o.name like
	 * :name&quot;; Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;(); params.put(
	 * &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) ); Foo foo = (Foo) commonDao.queryOne( sort, jpql,
	 * params );
	 * </pre>
	 * 
	 * @param sort 排序条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的第一个对象
	 */
	<X> X queryOne( Sort sort, String jpql, Map<String, ?> params );

	/**
	 * 使用 jpql语句，查出符合条件的分页对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * Page&lt;Foo&gt; foo = commonDao.queryPage( pageRequest, jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的分页对象
	 */
	<X> Page<X> queryPage(	PageRequest pageRequest,
							String jpql,
							Object... params );

	/**
	 * 使用 jpql语句，查出符合条件的第一个对象
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * Sort sort = new Sort().asc( &quot;name&quot; );
	 * PageRequest pageRequest = new PageRequest( 1, 10, sort );
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * Page&lt;Foo&gt; foo = commonDao.queryPage( pageRequest, jpql, params );
	 * </pre>
	 * 
	 * @param pageRequest 分页条件
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 符合条件的分页对象
	 */
	<X> Page<X> queryPage(	PageRequest pageRequest,
							String jpql,
							Map<String, ?> params );

	/**
	 * 执行jpql语句，用于批量执行更新或删除操作
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like ?&quot;;
	 * commonDao.execute( jpql, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 受影响的对象数量
	 */
	public int execute( String jpql, Object... params );

	/**
	 * 执行jpql语句，用于批量执行更新或删除操作
	 * <p>
	 * 示例：
	 * 
	 * <pre>
	 * String jpql = &quot;select o from Foo o where o.name like :name&quot;;
	 * Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;();
	 * params.put( &quot;name&quot;, &quot;name1&quot;.concat( &quot;%&quot; ) );
	 * commonDao.execute( jpql, params );
	 * </pre>
	 * 
	 * @param jpql jpql语句
	 * @param params jpql参数
	 * @return 受影响的对象数量
	 */
	public int execute( String jpql, Map<String, ?> params );

	/**
	 * 同步持久层上下文与数据库的状态
	 * <p>
	 * 示例： commonDao.flush();
	 */
	public void flush();

}
